home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / cat.c < prev    next >
C/C++ Source or Header  |  1990-07-21  |  2KB  |  93 lines

  1. /* cat - concatenates files          Author: Andy Tanenbaum */
  2.  
  3. /* 30 March 90 - Slightly modified for efficiency by Norbert Schlenker. */
  4.  
  5.  
  6. #include <blocksize.h>
  7. #include <sys/types.h>
  8. #include <fcntl.h>
  9. #include <string.h>
  10. #include <unistd.h>
  11.  
  12. static int unbuffered;
  13. static char ibuf[BLOCK_SIZE];
  14. static char obuf[BLOCK_SIZE];
  15. static char *op = obuf;
  16.  
  17. int main(argc, argv)
  18. int argc;
  19. char *argv[];
  20. {
  21.   int i, fd;
  22.  
  23.   i = 1;
  24.   /* Check for the -u flag -- unbuffered operation. */
  25.   if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 'u' && argv[1][2] == 0) {
  26.     unbuffered = 1;
  27.     i = 2;
  28.   }
  29.   if (i >= argc) {
  30.     copyfile(STDIN_FILENO, STDOUT_FILENO);
  31.   } else {
  32.     for ( ; i < argc; i++) {
  33.         if (argv[i][0] == '-' && argv[i][1] == 0) {
  34.             copyfile(STDIN_FILENO, STDOUT_FILENO);
  35.         } else {
  36.             fd = open(argv[i], O_RDONLY);
  37.             if (fd < 0) {
  38.                 std_err("cat: cannot open ");
  39.                 std_err(argv[i]);
  40.                 std_err("\n");
  41.             } else {
  42.                 copyfile(fd, STDOUT_FILENO);
  43.                 close(fd);
  44.             }
  45.         }
  46.     }
  47.   }
  48.   flush();
  49.   exit(0);
  50. }
  51.  
  52. copyfile(ifd, ofd)
  53. int ifd, ofd;
  54. {
  55.   int n;
  56.  
  57.   while (1) {
  58.     n = read(ifd, ibuf, BLOCK_SIZE);
  59.     if (n < 0) fatal();
  60.     if (n == 0) return;
  61.     if (unbuffered || (op == obuf && n == BLOCK_SIZE)) {
  62.         if (write(ofd, ibuf, n) != n) fatal();
  63.     } else {
  64.         int bytes_left;
  65.  
  66.         bytes_left = &obuf[BLOCK_SIZE] - op;
  67.         if (n <= bytes_left) {
  68.             memcpy(op, ibuf, n);
  69.             op += n;
  70.         } else {
  71.             memcpy(op, ibuf, bytes_left);
  72.             if (write(ofd, obuf, BLOCK_SIZE) != BLOCK_SIZE)
  73.                 fatal();
  74.             n -= bytes_left;
  75.             memcpy(obuf, ibuf + bytes_left, n);
  76.             op = obuf + n;
  77.         }
  78.     }
  79.   }
  80. }
  81.  
  82. flush()
  83. {
  84.   if (op != obuf)
  85.     if (write(STDOUT_FILENO, obuf, (size_t) (op - obuf)) <= 0) fatal();
  86. }
  87.  
  88. fatal()
  89. {
  90.   perror("cat");
  91.   exit(1);
  92. }
  93.